﻿//using System;
//using System.Collections.Generic;
//using System.Linq;
//using System.Text;

//using Microsoft.Research.Kinect.Nui;
//using Coding4Fun.Kinect.Wpf;

//using Microsoft.Xna.Framework;
//using DKE_Kinect.Entwicklung.Core;
//using System.Diagnostics;

//namespace DKE_Kinect.Entwicklung.Kinect.GestureEvents
//{
//    /// <summary>
//    /// Klasse, die Gesten des gesamten Körpers bereitstellt
//    /// </summary>
//    public class BodyGestures : GestureEvent
//    {
//        /// <summary>
//        /// Konstruktor für Körpergesten
//        /// </summary>
//        public BodyGestures()
//        {
//        }

//        private Vector3 pHead;
//        private Vector3 pTorso;
//        private Vector3 pLeftHip;
//        private Vector3 pRightHip;

//        /// <summary>
//        /// Initialisiert Body-Gesten
//        /// </summary>
//        /// <param name="skeleton"></param>
//        public void LookFor(Dictionary<JointID, Vector3> skeleton)
//        {

//            // Positionen definieren
//            Vector3 LeftShoulder = skeleton[JointID.ShoulderLeft];
//            Vector3 RightShoulder = skeleton[JointID.ShoulderRight];
//            Vector3 Head = skeleton[JointID.Head];
//            Vector3 Spine = skeleton[JointID.Spine];
//            Vector3 LeftHip = skeleton[JointID.HipLeft];
//            Vector3 RightHip = skeleton[JointID.HipRight];


//            // Temporäre Positionen setzen
//            if (this.pHead.X == 0)
//            {
//                this.pHead = Head;
//                this.pTorso = Spine;
//                this.pLeftHip = LeftHip;
//                this.pRightHip = RightHip;
//            }


//            // Breite des Oberkörpers bestimmen
//            double TopBodyRange = (Math.Max(Math.Max(Spine.Z, LeftShoulder.Z), RightShoulder.Z) - Math.Min(Math.Min(Spine.Z, LeftShoulder.Z), RightShoulder.Z));

//            // Neigung des Torso bestimmen                       
//            double BodyCurveSideRad = Math.Atan2((Spine.Y - this.pTorso.Y), (Spine.X - this.pTorso.X));
//            double BodyCurveSideDeg = Math.Abs(Math.Round(BodyCurveSideRad * 180 / Math.PI));

//            // Neigung des Torso bestimmen
//            double BodyCurveRad = Math.Atan2((this.pHead.Y - this.pLeftHip.Y), ((Head.Z - this.pHead.Z)));
//            //double BodyCurveRad = Math.Atan2((Torso.Y - this.pTorso.Y), (Torso.Z - this.pTorso.Z));
//            double BodyCurveDeg = Math.Abs(Math.Round(BodyCurveRad * 180 / Math.PI));

//            // Neigung der linken Seite bestimmen
//            double LeftSideCurveRad = Math.Atan2((LeftShoulder.Y - Spine.Y), (LeftShoulder.Z - Spine.Z));
//            double LeftSideCurveDeg = Math.Abs(Math.Round(LeftSideCurveRad * 180 / Math.PI));

//            // Neigung der Rechten Seite bestimmen
//            double RightSideCurveRad = Math.Atan2((RightShoulder.Y - Spine.Y), (RightShoulder.Z - Spine.Z));
//            double RightSideCurveDeg = Math.Abs(Math.Round(RightSideCurveRad * 180 / Math.PI));


//            if (BodyCurveSideDeg < 180)
//            {
//                // Prüfe auf Linkslehnen
//                if (BodyCurveSideDeg < 173 && BodyCurveSideDeg > 167)
//                {
//                    //EVENT
//                    OnGestureEvent(new GestureEventArgs(Gestures.LeanLeft, StateManager.CurrMode));
//                    return;
//                }

//                // Prüfe auf Rechtslehnen
//                if (BodyCurveSideDeg > 5 && BodyCurveSideDeg < 35)
//                {
//                    //EVENT
//                    OnGestureEvent(new GestureEventArgs(Gestures.LeanRight, StateManager.CurrMode));
//                    return;
//                }
//            }

//            // Prüfe auf Vorwärstlehnen
//            if (Spine.Z < LeftHip.Z && BodyCurveDeg > 105 && Spine.Z < RightHip.Z)
//            {
//                //EVENT
//                OnGestureEvent(new GestureEventArgs(Gestures.LeanForward, StateManager.CurrMode));
//                return;
//            }

//            // Prüfe auf Rückwärtslehnen                    
//            if (Head.Z > LeftHip.Z && BodyCurveDeg < 80 && Head.Z > RightHip.Z)
//            {
//                //EVENT
//                OnGestureEvent(new GestureEventArgs(Gestures.LeanBack, StateManager.CurrMode));
//                return;
//            }

//            // Prüfe auf Linksdrehung
//            if (LeftShoulder.Z > Spine.Z && RightShoulder.Z < Spine.Z && TopBodyRange > 225)
//            {
//                //EVENT
//                OnGestureEvent(new GestureEventArgs(Gestures.TurnLeft, StateManager.CurrMode));
//                return;
//            }

//            // Prüfe auf Rechtsdrehung
//            if (LeftShoulder.Z < Spine.Z && RightShoulder.Z > Spine.Z && TopBodyRange > 225)
//            {
//                //EVENT
//                OnGestureEvent(new GestureEventArgs(Gestures.TurnRight, StateManager.CurrMode));
//                return;
//            }
//        }

//    }
//}
